// 1.考察进程等待的意义， 同时理解wait/waitpid函数的使用

// 2.要求：

// 2.1代码创建子进程， 父进程调用wait/waitpid函数进行等待， 子进程打印“i am child process”之后，等待5s钟结束子进程；

// 2.2 父进程在等待到子进程之后， 分析子进程的退出信号， coredump标志位以及退出码， 并打印到标准输出
#include<iostream>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdio.h>

// int main()
// {
//   pid_t pid = fork();
//   if(pid<0)
//   {
//     std::cerr<<"创建子进程错误"<<std::endl;
//     exit(1);
//   }
//   else if(pid==0)
//   {
//     std::cout<<"i am child process"<<std::endl;
//     sleep(5);
//     exit(127);
//   }
//   else
//   {
//     int status = 0;
//     pid_t waitid = waitpid(pid,&status,0);
//     std::cout<<"this is a test for waitpid"<<std::endl;
//     //WEXITED(status) 为真则wait成功
//     if(WIFEXITED(status)&&waitid==pid)
//     {
//       std::cout<<"wait child process success : "<<WEXITSTATUS(status)<<std::endl;

//     }
//     else
//     {
//       std::cout<<"wait child process fail "<<std::endl;
//       exit(1);
//     }

//   }
//   return 0;
// }
// 1.考察进程程序替换函数簇的函数，利用任一一个进程程序替换函数完成代码。

// 理解进程程序替换的本质， 在深层次的理解程序员在 命令行当中启动一个程序， 本质上是bash程序启动了一个子进程， 子进程程序替换成为程序员启动的程序

// 2.要求： 将启动程序替换成为“ls”程序， 并且要给“ls”程序指定命令行参数， “-l”和“-a”

// 3.提交要求：提交代码截图， 提交替换完成之后代码的运行的结果

int main()
{
  pid_t pid =fork();
  if(pid<0)
  {
    std::cerr<<"创建子进程错误"<<std::endl;
    exit(1);
  }
  else if(pid==0)
  {
    std::cout<<"i am child process"<<std::endl;
    execl("/bin/pwd","pwd",NULL);
  }
  else
  {
    int status=0;
    pid_t waitid=waitpid(pid,&status,0);
    if(WIFEXITED(status)&&waitid==pid)
    {
      std::cout<<"wait child process success : "<<WEXITSTATUS(status)<<std::endl;
    }
    else
    {
      std::cout<<"wait child process fail "<<std::endl;
      exit(1);
    }
  }
  return 0;
}